##
## Attaching package: 'stationery'
## The following object is masked from 'package:knitr':
##
## rnw2pdf
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
El subindexado de vectores atómicos permite obtener partes de un vector atómico (los primeros elementos, los 10 últimos, etc.) y es útil en muchos tipos de análisis que suceden en diversas ramas de la ciencia. Supongamos que tenemos lo siguiente:
dnormales <- rnorm(20) # 10 numeros aleatorios de una dist. normal
dnormales # Imprimimos el vector
[1] -0.95390463 0.84676006 1.05281404 0.43584220 -0.09569678 -0.25360928
[7] 0.27256270 -1.00422140 -0.22305035 -0.45054774 -1.63519850 1.07411340
[13] -0.18859035 1.25971413 0.25463611 -0.97335104 0.63191917 0.05326954
[19] 0.02837501 0.39427672
1.- ?Cuál es el resultado de dnormales[order(x)],
dnormales[1:length(vec)], dnormales[-20],
dnormales[vec>0.5]?
dnormales <- rnorm(20) #ordena los elementos
dnormales[order(dnormales)]
[1] -2.13743429 -1.66820441 -1.20405445 -0.94537800 -0.83464511 -0.61813350
[7] -0.44021749 -0.34257579 -0.13286147 -0.04337416 0.05714074 0.19424824
[13] 0.24828604 0.24941790 0.36496062 0.47565874 0.50146445 1.66277416
[19] 1.76606888 1.90327166
dnormales <- rnorm(20)
dnormales[1:length(dnormales)]
[1] -1.0886519 -1.5450422 -0.4375252 -0.5459598 0.2684572 -0.3411389
[7] 0.3317342 -1.4785837 0.4272001 -1.2057789 1.0294631 -1.0053542
[13] -0.2978953 1.1914889 0.4672706 1.7847216 -0.1554261 2.0630333
[19] -0.5242432 0.5929636
dnormales <- rnorm(20) #elimina el elemento en la posicion 20
dnormales[-20]
[1] 1.535948337 -1.014710954 -1.209937430 0.050896573 -0.780051081
[6] 1.706619068 0.876679577 0.309167698 0.232985712 -0.168245108
[11] 1.254341983 1.435751431 -0.659765927 -1.585640308 -0.294152973
[16] 0.407420328 0.008386793 0.369845476 0.259094299
dnormales <- rnorm(20)
dnormales[dnormales>0.5]
[1] 1.3568585 1.5118583 0.5023308
2.- ?Qué sucede si hacemos dnormales[0:3]? ?Cuál es la
longitud del vector?
dnormales <- rnorm(20)
length(dnormales)# la longitud es de 20
[1] 20
dnormales[0:3]
[1] -1.5609889 -0.3579377 -2.4591109
length(dnormales[0:3])# la longitud es de 3
[1] 3
3.- Ahora suponga que x <- c(1,24,8) y
uno <- c(T,T,F). ?Qué sucede si hacemos
x[uno]? ?Y si hacemos x[as.double(uno)]?
x <- c(1,24,8)
uno <- c(T,T,F) # solo imprime los numero que tiene valor booleano T
x[uno]
[1] 1 24
x [as.double(uno)]# imprime su valor en binario donde T=1 y F=0
[1] 1 1
Puede referirse a las diapositivas
Las listas se pueden subindexar mediante los operadores
[, [[ y $. Recordemos que cuando
indexamos con [, el resultado siempre es del mismo tipo.
Ahora suponga que tenemos la siguiente lista:
listaPrueba <- list(Mayusculas = LETTERS[1:15], Ciudades = c("Cancun", "Playa", "Chetumal", "Merida"), casos = list(a=23, b= 1:8, c=list(d=1,e=TRUE)))
valor_e <- listaPrueba$casos$b[3]
valor_e
[1] 3
Ejercicios (en base al objeto listaPrueba),
1.- ?Con qué comando puedo obtener la lista casos? str(listaPrueba[[3]])
2.- ?Cómo puedo obtener el único valor lógico de
listaPrueba? valor_e <- listaPrueba\(casos\)c$e
valor_e
3.- ?Qué sucede si hago listaPrueba[[3]]$c[[2]], es esto
equivalente a listaPrueba$casos[[3]][[2]]? Explique
Lo que pasa es que listaPrueba[[3]]\(c[[2]] es lo mismo que
listaPrueba\)casos[[3]][[2]], solo que en el primer ejemplo
ingresamos al dato 3 de la lista principal y de ahà a la sublista, y
luego al dato 2, lo que nos da como resultado el valor
booleano.
4.- ?Cuál es la diferencia entre listaPrueba[1] y
listaPrueba[[1]]? imprime el nombre de la casilla y
los elementos dentro de ella el otro solo imprime los
elementos
5.- ?Cómo puedo obtener el objeto "Chetumal"?
valor_e <- listaPrueba$Ciudades[3]
valor_e
6.- ?Cómo puedo obtener el tercer elemento de b?
valor_e <- listaPrueba\(casos\)b[3]
valor_e
Suponga que tenemos la matriz:
matriz1 <- matrix(1:100 , nrow=20, ncol=5)
r1 <- matriz1[c(1,2),c(3,4)]
r2 <- matriz1[1:2,c(3,4)]
resultado <- identical(r1 , r2)
resultado
[1] TRUE
A partir de matriz1, hallar:
1.- La matriz que consta de las primeras dos columnas de
matriz1. matriz1[,1:2]
2.- La matriz que consta de las primeras dos filas y dos columnas de
matriz1. matriz1[1:2,1:2]
3.- La matriz que consta del elemento \(a_{2,3}\) de matriz1
matriz1[2,3]
4.- ?Son equivalentes los comandos
matriz1[c(1,2),c(3,4)] y matriz1[1:2,c(3,4)]?
(tip: puede probar con el comando identical) r1
<- matriz1[c(1,2),c(3,4)] r2 <-
matriz1[1:2,c(3,4)]
resultado <- identical(r1 , r2)
resultado
data.frameEl subindexado de data.frames es similar al subindexado
por medio de listas y matrices. En este caso nos concentraremos en el
paquete dplyr que permite manipular
data.frames. Cualquier paquete en R se puede
instalar mediante el comando
install.packages(<nombre.paquete>), por ejemplo para
instalar dplyr hacemos:
install.packages("dplyr", dependencies = TRUE) # instalo el paquete
library(dplyr) # Cargo el paquete para trabajar con sus funciones
1.- Investigar para qué sirve el paquete dplyr.
El paquete dplyr es una herramienta muy útil en RStudio y en R
en general para la manipulación y transformación de datos enmarcada en
la programación funcional. dplyr se utiliza para realizar operaciones de
manipulación de datos de manera eficiente, lo que facilita la
exploración y el análisis de datos en R
2.- ?Cuáles son los comandos importantes del paquete
dplyr? filter(): Filtra filas de un DataFrame en
función de condiciones especÃficas. Por ejemplo, puedes usar filter()
para seleccionar filas que cumplan con ciertos criterios.
select(): Selecciona columnas especÃficas de un DataFrame. Útil cuando solo deseas trabajar con un subconjunto de las variables.
mutate(): Crea nuevas columnas o modifica columnas existentes en un DataFrame. Puedes usarlo para calcular nuevas variables basadas en las existentes.
arrange(): Ordena filas de un DataFrame en función de una o más columnas. Puedes especificar el orden ascendente o descendente.
summarize() y group_by(): Son útiles para resumir datos agregados. group_by() permite agrupar datos por una o más columnas y summarize() se utiliza para resumir los datos dentro de cada grupo.
join(): Combina dos o más DataFrames en función de claves comunes. dplyr admite varios tipos de uniones, como inner join, left join, right join y full join.
rename(): Cambia el nombre de las columnas de un DataFrame.
distinct(): Encuentra filas únicas en un DataFrame, eliminando duplicados.
sample_n() y sample_frac(): Extrae aleatoriamente un número especÃfico de filas o una fracción de filas de un DataFrame.
3.- Supongamos que tenemos un data.frame
df <- data.frame(a=1:8, letras =letter[1:8]), qué sucede
si aplico select(df, a). ?Y si aplico
filter(df, a<5)?
df <- data.frame(a=1:8, letras=letters[1:8])
select(df,a) # imprime solo los elementos de a
filter(df, a<5)# imprime solo los elementos de a menores que 5
Los gráficos permiten mostrar múltiples caracterÃsticas de una
función. Los máximos, mÃnimos, etc., son métricas que nos dicen mucho
acerca del comportamiento de una función. R nos permite
graficar funciones de manera sencilla utilizando el concepto de vector.
Por ejemplo, quizás estemos interesados en conocer la forma de onda de
la función seno acotada, la cual se define matemáticamente mediante la
siguiente fórmula:
\[
f(t) = \begin{cases}
\sin(2 \pi t) & \mbox{para} -1 < t < 1\\
0 & \mbox{resto}.
\end{cases}
\] Y la cual en R se graficar? de la siguiente
manera:
t <- seq(-1, 1, length=100)
ft <- sin(2*pi*t) # Se calcula la funcion seno a partir de t
plot(t, ft, type="l", xlim=c(-4,4), ylim=c(-1.5,1.5), main="Funcion seno", xlab="tiempo", ylab="Valores")
grid()
R permite añadir gráficos o puntos mediante las
funciones lines() y points(). El siguiente
código ejemplifica lo anterior.
t <- seq(-3,3, length=200)
f1 <- sin(2*pi*(t))
f2 <- sin(2*pi*(t-1/4))
f3 <- sin(2*pi*(t-1/2))
plot(t,f1, type= "l", main="Funcion seno y versiones", xlab="tiempo", ylab="Valores")
grid()
lines(t,f2, col="red")
points(t,f3,col="blue")
De igual manera se pueden definir funciones por tramos con el comando
ifelse(), por ejemplo grafiquemos la siguiente función:
\[ f(t) = \begin{cases} 2+t & \; -2<t<-1\\ 1 & \; -1<t<1\\ 2-t & \;1<t<2\\ 0 & \; \mbox{resto} \end{cases} \]
t <- seq(-3,3, length=100)
ft <- ifelse(t> -2 & t < -1, 2+t, ifelse(t>= -1 & t <= 1, 1, ifelse(t>1 & t< 2, 2-t, 0)))
plot(t, ft, type = "l", main="Funcion por tramos", xlab="tiempo", ylab="Valores")
grid()
Graficar las siguientes funciones:
\[ f(t) = \begin{cases} 1 & \; t>0\\ 0 & \; \mbox{resto} \end{cases} \]
t <- seq(0,1, length=100)
f <- t > 0
plot(t, f, type="l")
\[ f(t) = \begin{cases} 1+t & \; -1<t<0\\ 1-t & \; 0 \le t<1\\ 0 & \; \mbox{resto} \end{cases} \]
t <- seq(-3,3, length=100)
ft <- ifelse(t> -1 & t < 0, 1+t, ifelse(t>= 0 & t < 1, 1-t,0))
plot(t, ft, type = "l")
grid()
\[ f(t) = \begin{cases} \mbox{e}^{-2t} & \; 0<t<2\\ 1+t & \; -1<t<0\\ 0 & \; \mbox{resto} \end{cases} \]
t <- seq(-3,3, length=100)
ft <- ifelse(t> 0 & t < 2,exp(-2 * t) , ifelse(t> -1 & t < 0, 1+t,0))
plot(t, ft, type = "o")
grid()
Los gráficos en 3D permiten visualizar funciones del tipo: \(f(x,y)\), donde \(x\) e \(y\) representan variables independientes.
Como ejemplo veamos la forma en la cual R grafica la
siguiente funci?n \(f(x,y) =
\sqrt{16-4x^2-y^2}\):
x <- seq(-2,2,length=50)
y <- seq(-4,4, length=50)
z <- outer(x,y,function(x,y) sqrt(16-4*x^2-y^2))
z[is.na(z)] <- 0
persp(x,y,z, theta=-30, expand=0.5,ticktype = "detailed")
persp(x,y,z, theta=30, expand=0.5, ticktype = "detailed")
image(x,y,z)
contour(x,y,z, add=TRUE)
Ejemplos: Ahora veamos la manera de hacerla con más funciones.
##Ahora para la función \(z = y^2-x^2\)
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) y^2-x^2)
persp(x,y,z, theta=-30, expand=0.6, ticktype = "detailed")
persp(x,y,z, theta=30, expand=0.6, ticktype = "detailed")
image(x,y,z)
contour(x,y,z, add=TRUE)
##Ahora para la función \(f(x,y)= (2+x^2-y^2) \mbox{e}^{1-x^2-(y^2)/4}\)
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) (2-y^2+x^2)*exp(1-x^2-(y^2)/4))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")
persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")
image(x,y,z)
contour(x,y,z, add=TRUE)
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) x+y)
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")
persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")
image(x,y,z)
contour(x,y,z, add=TRUE)
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) 6-(2*x)-(3*y))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")
persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")
image(x,y,z)
contour(x,y,z, add=TRUE)
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) (x^2)+(4*y^2) )
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")
persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")
image(x,y,z)
contour(x,y,z, add=TRUE)
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) sqrt(9-(x^2)-(y^2) ) )
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")
persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")
image(x,y,z)
contour(x,y,z, add=TRUE)
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) x*y )
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")
persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")
image(x,y,z)
contour(x,y,z, add=TRUE)
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) exp((x*y)/2 ))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")
persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")
image(x,y,z)
contour(x,y,z, add=TRUE)
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) x/((x^2)+(y^2)) )
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")
persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")
image(x,y,z)
contour(x,y,z, add=TRUE)
x <- seq(-10, 10, length = 50)
y <- seq(-10, 10, length = 50)
z <- outer(x, y, function(x, y) log(x - y + 1e-6))
persp(x, y, z, theta = -100, expand = 0.5, ticktype = "detailed", main = "Perspective Plot 1")
persp(x, y, z, theta = 100, expand = 0.5, ticktype = "detailed", main = "Perspective Plot 2")
image(x, y, z, main = "Image Plot")
contour(x, y, z, add = TRUE)